package com.zzl.example.springboottest.util;

import com.zzl.example.springboottest.bean.Student;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @author: javaroads
 * @date: 2022/11/22 22:12
 * @description: 排序方法
 */
public class SortUtil {

    public static void main(String[] args) {
        int[] nums = {
                1, 3, 5, 7, 9, 2, 4, 6, 8, 0
        };
        selectSort(nums);
    }

    /**
     * 该函数实现了选择排序算法，对传入的整型数组进行排序，并打印排序结果。
     * 选择排序算法的原理是每次从未排序部分选取最小值，然后将其与未排序部分的第一个值交换位置。具体实现如下：
     * 外层循环遍历数组元素，从第一个元素到倒数第二个元素。
     * 在内层循环中，从外层循环的当前位置开始，遍历剩余的元素，找到最小值及其索引。
     * 如果最小值的索引不等于外层循环的当前位置，将最小值与当前位置的元素交换。
     * 外层循环结束后，数组已排序部分的最后一个元素即为最小值。
     * 打印排序后的数组。
     * 该算法的时间复杂度为O(n^2)，适用于小规模或部分有序的数组排序。
     * @param arr
     */
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            int min = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
                if (min > arr[j]) {
                    min = arr[j];
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i]= min;
            }
        }
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + " ");
        }
    }


    private static void sortList() {
        List<Student> studentList = Arrays.asList(
                new Student("s1", "小李", 18, "女", "一班"),
                new Student("s2", "小王", 20, "男", "三班"),
                new Student("s3", "小张", 19, "男", "四班"),
                new Student("s4", "小汪", 19, "男", "二班"));

        System.out.println("排序前");
        studentList.forEach(System.out::println);

        // 方法一：Java8之前，不用lambda表达式
        studentList.sort(new Comparator<Student>() {
            @Override
            public int compare(Student student1, Student student2) {
                return student1.getAge() - student2.getAge();
            }
        });

        // 用forEach打印出排序后的list
        System.out.println("方法一：Java8之前，不用lambda表达式,排序后的list：");
        studentList.forEach(System.out::println);
        // 方法六：lambda倒序
        Comparator<Student> compare = Comparator.comparingInt(Student::getAge);
        studentList.sort(compare.reversed());
        System.out.println("方法六：lambda倒序后的list：");
        studentList.forEach(System.out::println);
    }
}
